#ifndef IMPRESOR_H
#define IMPRESOR_H

#include <QSize>
#include <QPointF>
#include <QPrinter>
#include <QPen>
#include "estadoimpresion.h"
#include "elementoimpresion.h"
#include "FragmentoImpresion.h"
#include "lectordocumento.h"
#include "informe.h"
#include "informes_global.h"

class INFORMES_EXPORT Impresor
{
public:
    Impresor();
    virtual ~Impresor();

    void activarSalidaPdf(const QString& nombreArchivoPdf, bool mostrarResultado);
    void activarSalidaImpresora();
    
    void imprimir(Informe* informe);
    void imprimir(FragmentoImpresion* cuerpo);
    void imprimir(FragmentoImpresion* cabecera, FragmentoImpresion* documento, FragmentoImpresion* pie);

    int getDpi();

    QSizeF getTamanoPaginaMilimetros();

    QSize getTamanoPaginaPixeles();

    QPrinter* getPrinter() { return &printer; }

    QString getNombreArchivoPdf() { return nombreArchivoPdf; }

protected:
    void imprimirPaginas(LectorDocumento& lector, EstadoImpresion& estado, bool completo);
    void imprimirLineaElementos(QList<ElementoImpresion*> elementosLinea, EstadoImpresion& estado, int anchoLinea);
    int calcularAltoLinea(QList<ElementoImpresion*> elementosLinea, EstadoImpresion& estado);
    ElementoImpresion* dividirElemento(LectorDocumento& lector, ElementoImpresion* elemento, int anchoDisponible, EstadoImpresion& estado);
    int calcularDescenso(QList<ElementoImpresion*> elementosLinea, EstadoImpresion& estado);

    void inicioPagina();
    void finPagina();

    int calcularAlto(FragmentoImpresion* documento, QPainter* painter);

private:
    QPrinter printer;
    QString nombreArchivoPdf;
        
    int paginaActual;
    bool modoCalculoTamano;

    EstadoImpresion estadoImpresionCabecera;
    EstadoImpresion estadoImpresionCuerpo;
    EstadoImpresion estadoImpresionPie;

    FragmentoImpresion* cabecera;
    FragmentoImpresion* pie;

    FragmentoImpresion documentoVacio;
};

#endif // IMPRESOR_H
